package com.nowcoder.community.controller.interceptor;

import com.nowcoder.community.annotation.LoginRequired;
import com.nowcoder.community.util.HostHolder;
import jdk.nashorn.internal.ir.ReturnNode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;

/**
 * @BelongsProject: community
 * @BelongsPackage: com.nowcoder.community.controller.interceptor
 * @Author: Master_XXJS
 * @CreateTime: 2022-09-28  09:22
 * @Description: TODO
 * @Version: 1.0
 */
@Component
public class LoginRequiredInterceptor implements HandlerInterceptor {

    @Autowired
    private HostHolder hostHolder;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //因为这个注解是作用到 方法上面的，所以判断是不是 方法 被拦截了，因为不是方法的也会遭到拦截
        if (handler instanceof HandlerMethod){
            HandlerMethod handlerMethod = (HandlerMethod) handler; //向下转型，强转
            Method method = handlerMethod.getMethod();
            //通过反射获取这个注解，看是否存在这个注解
            //因为是拦截的全部路径，没有这个注解的方法也会遭到拦截
            LoginRequired annotation = method.getAnnotation(LoginRequired.class);
            //如果没有登陆，就去登录，如果注解等于 null，说明不用拦截。
            //这里的意思是，有注解并且没有登录的话，就拦截，  其他不拦截
            if (annotation != null && hostHolder.getUser() == null){
                //return false意味着请求执行到此为止, 不会继续执行后续的部分了, 因为重定向已经完成了对这个请求的处理.
                //先重定向再返回。重定向实际上是给浏览器一个响应，这个操作本身是没有返回，不代表程序的终止。
                // 如果，重定向这句话后面还有其他逻辑，那么后面的逻辑也会被执行
                response.sendRedirect(request.getContextPath() + "/login");
                //false ,进行拦截
                return false;
            }
        }

        return true;   // true,不拦截，放行
    }
}

